package synchronize.synchronize003;

/**
 * 对象锁同步和异步的问题
 */
public class MyObject {

    /**
     * 打印线程的名称后休眠4秒（同步线程锁）
     */
    public synchronized void method1() {
        try {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 打印当前线程的名称（异步）
     */
    public void method2() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        final MyObject mo = new MyObject();

        /**
         * 分析：
         * t1线程先持有object对象的lock锁，t2线程可以以异步的方式调用对象中的非synchronized修饰方法。
         * t2线程先持有object对象的lock锁，t2线程如果在这个时候调用对象中的同步synchronized方法则需要等待，也就是同步
         */

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                mo.method1();
            }
        }, "t1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                mo.method2();
            }
        }, "t2");
        t1.start();
        t2.start();
    }
}
